import { BASE_URL } from './config'
import { getCurrentUserInfo, handleLogout } from '@/utils/auth'

// 创建请求实例
function request(options) {
  return new Promise((resolve, reject) => {
    // 构建完整URL
    let url = `${BASE_URL}${options.url}`

    // 统一处理查询参数（支持 options.params；兼容 GET + data 误用）
    const method = (options.method || 'GET').toUpperCase()
    const params = options.params || (method === 'GET' && options.data ? options.data : null)
    if (params && typeof params === 'object') {
      // 手动构建查询字符串，兼容APP端
      const queryParts = []
      Object.keys(params).forEach((key) => {
        const value = params[key]
        if (value === undefined || value === null) return
        if (Array.isArray(value)) {
          value.forEach(v => queryParts.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(v))}`))
        } else {
          queryParts.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`)
        }
      })
      const queryString = queryParts.join('&')
      if (queryString) {
        url += (url.includes('?') ? '&' : '?') + queryString
      }
    }

    // 使用统一的用户信息获取函数
    const userInfo = getCurrentUserInfo()
    const userId = userInfo ? userInfo.userId : ''
    const token = userInfo ? userInfo.token : ''

    // 记录认证信息用于调试（如需可在生产环境关闭）
    console.log('Request - 完整用户信息:', userInfo)
    console.log('Request - userId:', userId, 'token:', token)
    console.log('Request - 请求URL:', url)
    console.log('Request - 请求方法:', method)
    console.log('Request - 请求头:', {
      'Content-Type': 'application/json',
      'Authorization': token ? `Bearer ${token}` : '',
      'X-User-ID': String(userId || ''),
      'X-Token': token || ''
    })

    // 构建请求配置
    const requestOptions = {
      url: url,
      method,
      header: {
        'Content-Type': 'application/json',
        'Authorization': token ? `Bearer ${token}` : '',
        'X-User-ID': String(userId || ''), // 确保是字符串
        'X-Token': token || '',
        ...options.headers
      },
      success: (response) => {
        const { data, statusCode } = response

        // 处理成功响应
        if (statusCode >= 200 && statusCode < 300) {
          resolve(data)
        } else {
          // 处理401未授权错误
          if (statusCode === 401) {
            // 统一登出与跳转
            try {
              handleLogout(true)
            } catch(e) {
              console.error('handleLogout 调用失败，回退到本地清理:', e)
              uni.removeStorageSync('userState')
              uni.removeStorageSync('userId')
              uni.removeStorageSync('token')
              uni.showToast({
                title: '请重新登录',
                icon: 'none',
                duration: 1500
              })
              setTimeout(() => {
                uni.redirectTo({
                  url: '/pages/login/login'
                })
              }, 1500)
            }
          }
          reject(new Error(data?.error || `请求失败(${statusCode})`))
        }
      },
      fail: (error) => {
        console.error('请求错误:', error)
        reject(new Error('网络请求失败，请检查网络连接'))
      }
    }

    // 处理请求体（仅在非GET时发送 data）
    if (options.data && method !== 'GET') {
      requestOptions.data = options.data
    }

    // 发送请求
    uni.request(requestOptions)
  })
}

export default request